#ifndef MCVARRAY_H
#define MCVARRAY_H

#include "mcvcommon.h"
#include "mcvdatum.h"
#include <vector>

namespace MCV
{

struct FlatArrayInfo
{
	int ndims;
	int type;
	int* dimsizes;
	int* dimweights;
	int minpos;
	int maxpos;
	void* dataptr;
};

class Array
{
public:
	virtual int type()=0;
	virtual int rawType()=0;
	virtual int subType()=0;

	virtual int getId()=0;
	virtual void setId(int newId)=0;

	virtual int numElements()=0;
	virtual int numDims()=0;
	virtual int size(int d)=0;
	virtual std::vector<int> size()=0;

	virtual int stype1d(int x)=0;
	virtual int stypeNd(int* coords, int N)=0;

	virtual Datum get1d(int x)=0;
	virtual Datum get2d(int x, int y)=0;
	virtual Datum get3d(int x, int y, int z)=0;
	virtual Datum getNd(int* coords, int N)=0;

	virtual void incrRefCount()=0;
	virtual void decrRefCount()=0;
	virtual int refCount()=0;

	virtual bool isFlat()=0;
	virtual FlatArrayInfo* getFlatArray()=0;

	virtual bool soft()=0;
	virtual const std::string getEncoderType()=0;
	virtual void setmm(MemoryManager* mm)=0;
};

}

#endif